//
//  ReadMe.swift
//  CZVVeiBo
//
//  Created by smile on 2017/7/30.
//  Copyright © 2017年 itcast. All rights reserved.
//

/*
 
------第四天内容总结--------
 
    - readMe作用
 
    - 在开元中国码云中创建原创服务器中搭建远程仓库
    - 介绍SSH协议完成远程服务器和客户端数据传输
    - 配置SSH
    - 克隆项目到本地
    - 添加忽略文件（忽略文件需要先添加）
    - 创建新浪微博项目
    - 设置项目相关信息（appicon 启动图 最低支持版本 横竖屏 类前缀）
    - 明细项目文件夹 开发模式选择
    - MVVM
    - 主控制器（mainVc）
        - 首页
        - 消息
        - 发现
        - 我
    - 添加子控制到主控制器中
    - 自定义tabBar
        - 使用KVC完成只读数组赋值操作
        - 遍历tabBar中的子控件完成子控件UIBarButton的frame的设置
    - 通过闭包完成监听CZTabBar中的撰写按钮点击
    - 封装UIBarButtonItem（便利构造函数）
    - 自定义导航控制器
        - 对导航控制器的左侧按钮进行业务逻辑处理
        - 解决自定义返回按钮后收拾pop失效bug
    - 定义Common文件
        - 屏幕的宽和高
        - RGB颜色和随机颜色
 
 ------第五天内容总结--------
 - 上午
    - 安装 cocoaPods
    - 抽取BaseVc父类控制器（home message  discover profile）
    - 自定义访客视图（visitorView）添加到BaseVc
    - BaseVc 定义了一个属性（bool）判断用户是否登陆
        - BaseVc 重写父类已有的方法 loadView 
            - 如果不重写 系统帮我们创建一个view
            - 如果重写super.loadView 系统帮我们创建一个view
            - 如果view = 自定义view 自己创建view
    - 搭建visitorView的子控件
        - 圆圈图片 ,遮挡图片 文字 注册登陆按钮 logo
        - 第三方框架 SnapKit
 
 - 下午
    - 在visitorView中提供一个供外界使用的方法-> 设置logo 文字
    - 在BaseVc中定义个全局visitorView
    - 分别在不同的子控制器中来设置每个控制器显示显示的logo和文字
    - 如何区分首页和其他控制器 -> 可选值完成的
        - 如果不是首页
            - logo 文字 隐藏圆圈图片
        - 是首页
            - 设置圆圈动画
    - 添加未登陆状态下导航栏左右侧登陆注册按钮
    - 监听visitorView注册和登陆按钮点击
    - 自定义微博登陆界面
        - 模态形式弹出
        - 设置导航栏
        - 添加webView
        - 加载授权界面
        - 在微博开放平台注册应用
        - js注入输入用户名和密码
        - 给webView设置代理监听webView将要加载的请求截取获取code(授权码)
 
------第六天内容总结--------
 
 - 上午
    - 回顾下OC中单例的定义
    - 学习Swift中单例的定义
    - Swift项目中使用OC的类
        - 需要使用桥接文件 在桥接文件中导入OC的类
        - 如果没有按照系统提示创建桥接文件 需要自己手动创建桥接文件和配置路径
    - OC项目中使用Swift的类
        - 在OC的类中#import "项目名-Swift.h"
        - 项目名中不能包含中文和数字或者特殊符号
        - product name 
    - OC中对AFN进行网络封装 -> 2次封装
        - get post 封装
        - 每个接口的封装
    - Swift中对AFN进行封装
    - 请求新浪微博的接口数据
        - 使用YYModel 完成数据解析（字典转模型的操作）
        - token token过期时间 uid

 - 下午
    - 请求个人信息数据(头像和昵称)
        - 赋值操作
            - 手动赋值
    - 个人信息数据需要进行保存（本地-> 模型 —> 对象）
        - 归档和解档方式 -> YYModel    
        - OAuthVc中实现 保存模型和获取模型的方法
    - 定义一个OAuthViewModel
        - 定义成单例(数据要服务于整个项目-对象唯一即可)
        - 帮助OAuthVc请求数据
        - 帮助OAuthVc保存数据
        - 帮助整个项目提供保存的数据
    - 对网络请求进行封装 -> NetworkTools
    - 开发欢迎界面
        - 控制器
        - 背景图片
        - 头像
        - 文字
 
 
 
 ------第七天内容--------
 
    - 新浪微博根控制器选择
        - 通过判断用户是否登陆
            - true
                - window.rootVc = CZWelcomeVc
            - false
                - window.rootVc = CZMainVc(未登陆)
 
 - 上午
    - 欢迎界面的头像和文字动画
        - 头像 -> 阻尼动画
        - 文字 -> 透明度动画
        - 找到设置动画的时间点
            - 监听控制器界面已经显示
        
    - APP跟控制器的选择
        - 如果用户已经登陆了
            - window.rootVc = CZWelcomeVc
        - 如果用户没有登录
            - window.rootVc = CZMainVc
    -  通过发送通知告知appdelegate切换根控制器
        - 如果OAuthVc 发送通知 window.rootVc -> CZWelcomeVc
        - 如果WelcomeVc 发送通知 window.rootVc -> CZMainVC
    -  在BaseVc判断如果用户已经登陆BaseVc的view = tableView
    -  在首页进行请求首页数据
        - 创建模型
        - 保存数据
    - 设置tableView的数据源代理
        - 使用系统的cell简单展示下cell
 
 
- 首页cell布局分析
    - 原创微博
        - 头像
        - 名字
        - 会员等级
        - 时间
        - 来源
        - 认证类型
        - 微博文字
        - 配图（可能有也可能没有）
    - 转发微博（可能有也可能没有）
        - 微博文字
        - 配图（可能有也可能没有）
    - 底部视图
        - 转发
        - 评论
        - 赞

 - 下午
    - 自定义首页cell
    - 自定义原创微博
        - 最终原创微博的底部==微博文字的底部+10
    - 创建CZHomeListViewModel
        - 帮助首页请求数据
        - 保存数据
        - 提供数据
    - 把请求抽取到CZNetworksTools中
    - 创建CZHomeViewModel
        - 处理模型中数据服务于Cell 里面的子控件原创微博 转发微博 底部视图
        - 遍历服务器返回的模型数组 依次创建每个viewModel 进行保存
    - 原创微博的进行赋值
    - 处理微博用户等级显示的图片
 

 
 ------第八天内容--------
 
 - 上午
 
    - 处理原创微博中会员认证
        - 抽取到ViewModel中
    - 创建底部视图
        - 三个按钮和两个竖线
    - tableView 自动计算行高，需要设置预估行高
    - 创建转发微博
        - 微博文字
    - 通过服务器得到数据来判断是否有转发微博
        - 如果有转发微博
        - 如果没有转发微博
    - 创建配图
    - 通过服务器得到的数据来判断是否有配图
        - 有配图
        - 没有配图
    - 通过配图图片的个数来计算配图的大小
 
 - 下午
    - 自定义配图cell 显示图片
        - 给其cell 提供数据(pictureUrlModel)
        - 设置图片填充方式
    - 转发微博的配图
    - 单张图片缓存
        - 在请求网络数据到本地后完成字典转模型操作
        - 遍历模型数组
            - 判断原创微博或者转发微博如果是一张图片需要进行下载（sdwebImage）
            - 使用调度组监听图片是否下载完成
    - 自定义配图中判断如果是一张图片
        - 需要通过key获取本地保存的图片
        - 计算得到本地图片的宽和高
            - 如果图片宽度过小 或者高度过大 需要处理一下
        - 给配图设置为图片的宽和高
    - 自定义上拉加载更多控件
        - footerView
        - 监听cell将要显示的代理方法完成请求数据操作
    - 分析微博首页接口
        - 引出since_id & max_id
        - 判断是下拉刷新和上拉加载更多状态
 
 
 ------第九天内容--------
 
 
 - 自定义下拉刷新控件分析
    - 继承于谁 -> UIControl
    - 添加到谁身上 -> tableView
    - 分析控件的状态
        - 正常中（拖动tableView）
        - 下拉中（拖动tableView）
        - 刷新中 （当前的状态为下拉中 且松手）
 

 - 上午
    - 完成上拉加载更多的控件集成和使用
    - 使用系统的UIRefreshControl
    - 自定义CZRefreshControl
    - 通过UIControl中 willMovetosuperView
    - 通过KVO完成监听父控件的属性变化
        - KVO注册
        - KVO实现
        - deinit KVO移除
    - KVO实现找到TableView判断的临界值-114
        - 拖动TableView
            - 正常
            - 下拉
        - 停止拖动
            - 如果其状态为下拉 -> 刷新
    - CZRefreshControl中添加MessageLabel
    - 定义一个全局的属性type 决定MessageLabel显示什么文字
 
 - 下午
    - CZRefreshControl 添加箭头图片
        - 设置动画 默认情况箭头朝下 下拉中 朝上 （UIView动画）
    - CZRefreshControl 添加风火轮
        - 在刷新中 隐藏箭头  开启风火轮动画
        - 在正常中 显示箭头  停止风火轮动画
    - 把CZRefreshControl集成到到微博项目中
    - 处理微博来源（通过字符串的截取完成）
    - 处理微博时间（需要使用计算型属性）
    - pictureView中添加gif标识图片
        - 通过url地址的后缀是否是.gif决定
 
 
 - 微博时间业务逻辑
    - 如果是今年
        - 如果是今天
            - 如果小于60
                - 显示 刚刚
            - 如果大于等于60 && 小于3600
                - 显示 XX分钟前
            - 如果大于等于3600
                - 显示 XX小时前
        - 如果是昨天
            - 20170803 02:02:02 格式 昨天 02:02
        - 其他
            - 20170707 07:07:07 格式: 07月07日 07:07
    - 如果不是今年
        - 20151212 12:12:12 显示格式: 2015年12月12日 12:12
 
 
 
 
  ------第十天内容--------
 
 - 上午
    - 首页提示label添加
        - nav.view navBar下面
        - 把ListViewModel 帮助首页请求数据的函数里面的闭包添加参数count
        - 首页设置动画
        - 延迟动画
        - 首次是隐藏的
        - 判断是否显示 如果显示的 返回
        - 设置动画满足条件(首次请求数据和下拉刷新)
    - ComposeView
        - 把控件添加到CZMainVc上
        - 使用的是类方法完成添加
        - 使用上下文完成主窗口内容截取
        - 使用OC的分类 UIImage+ImageEffects 完成图片磨砂效果处理
        - 添加logo图片
        - 自定义ComposeButton
            - 显示图片和文字是上下方式的
            - 取消高亮效果-> 重写高亮的属性
    - 通过pop框架设置ComposeButton的弹出动画-> 弹簧动画
 
 - 下午
    - 通过pop框架设置ComposeButton的消失动画-> 弹簧动画
        - 临界值+350
        - ComposeButton 的数组进行反向遍历
    - 监听6个ComposeButton点击
        - 使用UIView动画完成ComposeButton的放大和缩小动画
        - 当UIView动画完成后 在恢复原状
        - 监听按钮点击后 弹出发布微博微博界面
            - classname字符串得到对应的类名.type
            - 类名.type.init() 得到一个类对象
    - 开发发布微博界面
        - 自定义导航栏titleView控件
            - 富文本技术
    - 自定义TextView
        - 占位文字
        - 通过注册系统 通知完成监听textView是否有文字来隐藏或者显示占位文字
    - 自定义底部视图
        - 包含了5个按钮
            - 当5个按钮点击后 通过闭包传递枚举来告知外界的
 
 
 
   ------第十一天内容--------
 
 - 上午
    - 自定义发布微博的配图
        - 如果是1-8张最后一个配图显示的是加号图片
        - 点击加号图片打开相册
    - UIImagepickerController 获取相册的图片
    - 配图上添加删除按钮
        - 删除按钮后 可以删除指定图片
    - 自定义表情键盘
        - 主要是利用textView的inputView （系统键盘和表情键盘的切换）
        - 刷新inputView
        - 开启键盘的第一响应者
        - 判断是否是自定义表情键盘 更改底部视图按钮的图片
 
 - 下午
    - 自定义表情键盘中开发
        - 底部视图（默认  emoji  浪小花）
        - 设置当前默认选中状态
        - 通过枚举监听按钮点击
        - 自定义表情配图
            - 自定义cell
    - 读取bundle文件-> info.plist文件
        - plist转一维数组
        - 一维数组通过数组的截取 转 二维数组
        - 二维数组转三维数组
    - 把三维数组提供给表情配图
    - 提供数据给每个cell
        - 分两种
            - 图片表情
            - emoji
 
 
 
 ------第十二天内容--------
 
 - 上午
    - emoji表情显示到按钮上
        - 如果是emoji表情  image=nil
        - 如果是图片表情  title = nil
    - 自定义表情cell
        - 监听到外界给cell赋值
            - 20个按钮全部隐藏
            - 通过遍历外界传进来的一维数组 逐一在显示按钮
    - 每个cell上添加删除按钮
    - 监听20个表情按钮点击
        - 发送通知 -> object -> emoticonmodel(composeVc)
            - 20个表情按钮自定义（给其身上添加属性->model）
                - model.allPathPng  .code
                    - emoji 表情上屏
                        - String -> NSString - 使用OC -> NSStringEmoji
                    - 图片表情上屏
                        - 通过allPathPng  -> UIImage
                        - 创建文本附件 -> image bounce
                        - 通过文本附件创建不可变富文本
                        - 通过textView 的selectedRange 富文本替换
    - 监听删除按钮点击
    - 如果是图片表情
        - 显示和隐藏占位文字 -> 发送系统通知
        - 更改导航栏右侧按钮的状态 -> 执行协议方法
 
    - 首页图文混排
        - 正则表达式完成图片描述的获取
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 */


